package chapter4_对象组合.现有线程安全类中添加功能;

import annotation.NotThreadSafe;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 扩展线程安全类相关方法
 *
 * @param <E>
 */
public class ListHelper<E> {

    public final List<E> list = Collections.synchronizedList(new ArrayList<>());

    //该方法虽然有synchronized进行同步，但是确实使用的ListHelper当前实例作为锁对象
//    @NotThreadSafe
//    public synchronized boolean putIfAbsent(E x) {
//        boolean absent = !list.contains(x);
//        if (absent) {
//            list.add(x);
//        }
//        return absent;
//    }

    @NotThreadSafe
    public boolean putIfAbsent(E x) {
        synchronized (list) { // 确保list的其他操作和当前新扩展的方法用的同一个锁，synchronizedList中的的锁mutex也是指向list实例对象
            boolean absent = !list.contains(x);
            if (absent) {
                list.add(x);
            }
            return absent;
        }
    }
}
